// 数字转中文大写的映射



let chinese_digits = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"]
let chinese_units = ["", "拾", "佰", "仟"]
let chinese_sections = ["", "万", "亿", "兆"]

///| 处理四位数内的转换
fn convert_section(num : Int) -> String {
  if num == 0 {
    return ""
  }
  
  let mut result = ""
  let mut temp = num
  //let mut need_zero = false
  
  // 处理千位
  let qian = temp / 1000
  if qian > 0 {
    result = result + chinese_digits[qian] + chinese_units[3]
    //need_zero = true
  }
  temp = temp % 1000
  
  // 处理百位
  let bai = temp / 100
  if bai > 0 {
    result = result + chinese_digits[bai] + chinese_units[2]
  } else if qian > 0 && temp > 0 {
    // 千位有值，百位为0，但后面还有数字时需要加零
    result = result + chinese_digits[0]
  }
  temp = temp % 100
  
  // 处理十位
  let shi = temp / 10
  if shi > 0 {
    result = result + chinese_digits[shi] + chinese_units[1]
  } else if (qian > 0 || bai > 0) && temp > 0 {
    // 前面有数字，十位为0，个位不为0时需要加零
    result = result + chinese_digits[0]
  }
  temp = temp % 10
  
  // 处理个位
  if temp > 0 {
    result = result + chinese_digits[temp]
  }
  
  result
}

///|
/// 将整数转换为中文大写形式。
///
/// 参数：
///
/// * `num`：要转换为中文大写格式的整数。
///
/// 返回包含该数字中文大写表示的字符串。
///
/// 示例：
///
/// ```moonbit
/// inspect(@lib.Convert::to_chinese_upper(0), content="零")
/// inspect(@lib.Convert::to_chinese_upper(123), content="壹佰贰拾叁")
/// inspect(@lib.Convert::to_chinese_upper(1001), content="壹仟零壹")
/// inspect(@lib.Convert::to_chinese_upper(-456), content="负肆佰伍拾陆")
/// inspect(@lib.Convert::to_chinese_upper(12345), content="壹万贰仟叁佰肆拾伍")
/// inspect(@lib.Convert::to_chinese_upper(10001), content="壹万零壹")
/// inspect(@lib.Convert::to_chinese_upper(100000000), content="壹亿")
/// ```
///
pub fn Convert::to_chinese_upper(num : Int) -> String {
  if num == 0 {
    return chinese_digits[0]
  }
  
  if num < 0 {
    return "负" + Convert::to_chinese_upper(-num)
  }
  
  // 将数字分解为各个段
  let mut sections = []
  let mut temp = num
  while temp > 0 {
    sections = [temp % 10000] + sections
    temp = temp / 10000
  }
  
  let mut result = ""
  let sections_len = sections.length()
  
  for i = 0; i < sections_len; i = i + 1 {
    let section = sections[i]
    let section_index = sections_len - 1 - i
    
    if section > 0 {
      let section_str = convert_section(section)
      if section_str.length() > 0 {
        // 检查是否需要在前面添加零
        if i > 0 {
          // 检查前面是否有非零段
          let mut has_prev_content = false
          for j = 0; j < i; j = j + 1 {
            if sections[j] > 0 {
              has_prev_content = true
              break
            }
          }
          
          // 如果前面有内容且当前段小于1000，需要添加零
          if has_prev_content && section < 1000 {
            result = result + chinese_digits[0]
          }
        }
        
        result = result + section_str + chinese_sections[section_index]
      }
    } else if i > 0 && i < sections_len - 1 {
      // 中间段为0的情况，检查后面是否还有非零段
      let mut has_next_content = false
      for j = i + 1; j < sections_len; j = j + 1 {
        if sections[j] > 0 {
          has_next_content = true
          break
        }
      }
      
      // 如果前面有内容且后面也有内容，当前段为0时需要考虑添加零
      if has_next_content {
        let mut has_prev_content = false
        for j = 0; j < i; j = j + 1 {
          if sections[j] > 0 {
            has_prev_content = true
            break
          }
        }
        
        if has_prev_content {
          // 这里不直接添加零，让下一个非零段处理
        }
      }
    }
  }
  
  // 清理多余的零
  while result.contains("零零") {
    result = result.replace(old="零零", new="零")
  }
  
  // 移除开头和结尾的零
  if result.has_prefix("零") {
    result = result.substring(start=1)
  }
  if result.has_suffix("零") {
    result = result.substring(end=result.length() - 1)
  }

  result
}

///|
/// 将数字转换为中文大写人民币金额形式。
///
/// 参数：
///
/// * `amount`：要转换为中文大写人民币格式的数字（支持小数）。
///
/// 返回包含该金额中文大写表示的字符串。
///
/// 示例：
///
/// ```moonbit
/// inspect(Convert::to_chinese_currency(100.0), content="壹佰元整")
/// inspect(Convert::to_chinese_currency(123.45), content="壹佰贰拾叁元肆角伍分")
/// inspect(Convert::to_chinese_currency(1000.00), content="壹仟元整")
/// inspect(Convert::to_chinese_currency(0.05), content="伍分")
/// inspect(Convert::to_chinese_currency(10.50), content="壹拾元伍角")
/// inspect(Convert::to_chinese_currency(10001.00), content="壹万零壹元整")
/// ```
///
pub fn Convert::to_chinese_currency(amount : Double) -> String {
  if amount < 0.0 {
    return "负" + Convert::to_chinese_currency(-amount)
  }
  
  // 分离整数部分和小数部分
  let yuan_part = amount.to_int()
  let decimal_value = amount - yuan_part.to_double()
  
  // 将小数部分转换为5位整数（角分厘毫丝）
  let decimal_scaled = (decimal_value * 100000.0 + 0.5).to_int()
  let decimal_part = decimal_scaled % 100000
  
  let mut result = ""
  
  // 处理元的部分
  if yuan_part > 0 {
    result = Convert::to_chinese_upper(yuan_part) + "元"
  }
  
  // 处理小数部分（角分厘毫丝）
  let jiao = (decimal_part / 10000) % 10  // 角（第1位小数）
  let fen = (decimal_part / 1000) % 10   // 分（第2位小数）
  let li = (decimal_part / 100) % 10     // 厘（第3位小数）
  let hao = (decimal_part / 10) % 10     // 毫（第4位小数）
  let si = decimal_part % 10             // 丝（第5位小数）
  
  let mut decimal_str = ""
  let mut has_decimal = false
  
  // 处理角
  if jiao > 0 {
    decimal_str = decimal_str + chinese_digits[jiao] + "角"
    has_decimal = true
  }
  
  // 处理分
  if fen > 0 {
    if jiao == 0 && has_decimal {
      decimal_str = decimal_str + chinese_digits[0]
    }
    decimal_str = decimal_str + chinese_digits[fen] + "分"
    has_decimal = true
  }
  
  // 处理厘
  if li > 0 {
    if fen == 0 && has_decimal {
      decimal_str = decimal_str + chinese_digits[0]
    }
    decimal_str = decimal_str + chinese_digits[li] + "厘"
    has_decimal = true
  }
  
  // 处理毫
  if hao > 0 {
    if li == 0 && has_decimal {
      decimal_str = decimal_str + chinese_digits[0]
    }
    decimal_str = decimal_str + chinese_digits[hao] + "毫"
    has_decimal = true
  }
  
  // 处理丝
  if si > 0 {
    if hao == 0 && has_decimal {
      decimal_str = decimal_str + chinese_digits[0]
    }
    decimal_str = decimal_str + chinese_digits[si] + "丝"
    has_decimal = true
  }
  
  result = result + decimal_str
  
  // 如果没有小数部分，添加"整"
  if not(has_decimal) {
    if yuan_part > 0 {
      result = result + "整"
    } else {
      result = chinese_digits[0] + "元整"
    }
  }
  
  // 如果只有小数部分没有元的部分，去掉开头可能的"元"
  if yuan_part == 0 && has_decimal {
    result = decimal_str
  }
  
  result
}